<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>
    
    变量的作用域及静态变量 - DSRBLOG
    
  </title>
  

  
  
  <link href="atom.xml" rel="alternate" title="DSRBLOG" type="application/atom+xml">
  <link rel="stylesheet" href="asset/css/style.min.css">
  <link rel="stylesheet" href="asset/css/doc.css">
  <script src="asset/app.js"></script>


</head>

<body> <section class="ct-body">
	<div class="container">
		<div class="columns is-variable bd-klmn-columns is-4 is-centered">
			<div class="column is-four-fifths">
				<div class="post-body single-content">
					
					<h1 class="title">
						变量的作用域及静态变量
					</h1>


					<div class="media">
						
						
						<div class="media-content">
							<div class="content">
								<p>
									<span class="date">2022/01/15 23:55 下午</span>
									

									

									<br />
									<span class="tran-tags">Tags:</span>&nbsp;
									
									<a class="tag is-link is-light">#C语言</a>
									

								</p>
							</div>
						</div>

					</div>
				</div>
				<article class="markdown-body single-content">
					<h2><a id="%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>局部变量</h2>
<p>在一个函数内部定义的变量是内部变量，它旨在本函数范围内有效，也就是说只有在本函数内才能使用它们，在此函数之外是不能使用这些变量的。这称为“<em>局部变量</em>”。</p>
<h3><a id="%E4%BE%8B1" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>例1</h3>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;

float f1(int a) //函数f1()
{
    int b, c; //a、b、c在函数f1()中有效
    return 0;
} //f1()是a、b、c的作用域

float f2(int x, int y) //函数f2()
{
    int i, j; //x、y、i、j在函数f2()中有效
    return 0;
} //f2()是x、y、i、j的作用域

int main() //主函数
{
    int m, n; //m、n在主函数中有效
    return 0;
} //主函数是m、n的作用域
</code></pre>
<h3><a id="%E4%BE%8B2" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>例2</h3>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;

int main()
{
    int x = 1, y = 2;
    printf(&quot;main: %d %d\n&quot;, x, y);
    {
        int x, y;//就近原则，8-11行调用小范围的x、y
        x = 5;
        y = 6;
        printf(&quot;main: %d %d\n&quot;, x, y);
    }
    printf(&quot;main: %d %d\n&quot;, x, y);//不包含在小范围内，调用大范围的x、y
    return 0;
}

输出结果：
    main: 1 2
    main: 5 6
    main: 1 2
</code></pre>
<ul>
<li>
<p>主函数中定义的变量只在主函数中有效，而不因为在主函数中定义而在整个文件或程序中有效，主函数也不能使用其他函数中定义的变量。</p>
</li>
<li>
<p>不同函数中可以使用相同名字的变量，它们代表不同的对象，互不干扰。</p>
</li>
<li>
<p><code>形式参数</code>也是局部变量</p>
</li>
<li>
<p>在一个函数内部，可以在复合语句中定义变量，这些变量只在本复合语句中有效，这种复合语句也称为“<em>程序块</em>”</p>
</li>
</ul>
<h3><a id="%E9%9D%99%E6%80%81%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>静态局部变量</h3>
<p>  当函数中的局部变量的值在函数调用结束后不消失而保留原值时，该变量称为静态局部变量，用关键字<code>static</code>进行声明。</p>
<h4><a id="%E5%A6%82" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>如</h4>
<pre class="line-numbers"><code class="language-c">static int i;
</code></pre>
<h4><a id="%E4%BE%8B1" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>例1</h4>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;

int fun()
{
    int i = 1;
    static int j = 1; //仅在编译时进行一次赋初值，之后不会再重新进行赋值
    i += 1;
    j += 1;
    printf(&quot;i=%d j=%d\n&quot;, i, j);
    return 0;
}

int main()
{
    fun(); //i、j同时被定义并赋初值，输出后i的存储单元被释放，j的存储单元保留
    fun(); //i被定义并赋初值，j的存储单元保留原值，没有被重新定义，输出后i的存储单元被释放，j的存储单元保留
    fun(); //i被定义并赋初值，j的存储单元保留原值，没有被重新定义，输出后i的存储单元被释放，j的存储单元保留
    return 0;
}
</code></pre>
<ul>
<li>
<p>静态局部变量属于静态存储类别，在静态存储区内分配存储单元。在程序整个运行期间都不释放。</p>
</li>
<li>
<p>静态局部变量仅在编译时进行赋初值，以后每次调用函数时不会再重新赋初值，而是保留上次函数调用结束时的原值。</p>
</li>
<li>
<p>如在定义局部变量时不赋初值，静态局部变量的初始值默认为<code>0</code>（数值型变量）或<code>空字符</code>（字符型变量）。</p>
</li>
<li>
<p>虽然静态局部变量在函数调用结束后仍然存在，但其它函数不能引用它。</p>
</li>
</ul>
<h2><a id="%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>全局变量</h2>
<p><strong>注意：</strong> 过多使用全局变量会使代码可读性降低。</p>
<p>在函数之外定义的变量称为<em>外部变量</em>，外部变量是<em>全局变量</em>（全程变量）。全局变量可以为本文件中其它函数所共用，它的有效范围从定义变量的位置开始到本源文件结束。</p>
<h3><a id="%E4%BE%8B1" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>例1</h3>
<pre class="line-numbers"><code class="language-c">#include &lt;stdio.h&gt;

int p = 1, q = 5; //外部变量（全局变量）

float f1(int a)
{
    int b, c; //局部变量
    return 0;
}

char c1, c2; //外部变量（全局变量）
char f2(int x, int y)
{
    int i, j; //局部变量
    return 0;
}

int main()
{
    int m, n; //局部变量
    return 0;
}
</code></pre>
<ul>
<li>
<p>全局变量初值默认为0</p>
</li>
<li>
<p>当有局部变量和全局变量的变量名相同时，遵循就近原则</p>
</li>
<li>
<p>全局变量一旦被定义，将始终占据一个存储单元，直到程序结束才被释放</p>
</li>
</ul>
<h3><a id="%E9%9D%99%E6%80%81%E5%A4%96%E9%83%A8%E5%8F%98%E9%87%8F%EF%BC%88%E9%9D%99%E6%80%81%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%EF%BC%89" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>静态外部变量（静态全局变量）</h3>
<p>  在程序设计中，使用关键字<code>static</code>进行声明的外部变量只限于被本文件引用，而不能被其他文件引用。</p>
<h3><a id="%E5%9C%A8%E5%A4%9A%E6%96%87%E4%BB%B6%E7%9A%84%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%A3%B0%E6%98%8E%E5%A4%96%E9%83%A8%E5%8F%98%E9%87%8F" class="anchor" aria-hidden="true"><span class="octicon octicon-link"></span></a>在多文件的程序中声明外部变量</h3>
<p>  如果需要引用本程序内其它文件的外部变量，可以用<code>extern</code>声明一个来自其它文件的外部变量（无法引用其他文件内已经被<code>static</code>声明的外部变量）。</p>

				</article>
				<div class="comments-wrap">
					<div class="share-comments">
						

						

						
					</div>
				</div><!-- end comments wrap -->
			</div>
		</div><!-- end columns -->
	</div><!-- end container -->
</section>  














<script src="asset/prism.js"></script>









</body>

</html>